CREATE OR ALTER   PROCEDURE [dbo].[P_UDF_STOCKIN_YZ]
    @DATE VARCHAR(20),    --单据入库日期，格式必须是YYYYMMDD
	@DEPT VARCHAR(20),    --部门代号
	@HANDLER VARCHAR(20), --经办人
	@QTY NUMERIC(12, 4),  --入库数量
	@MOCODE VARCHAR(20),  --生产订单
	@XCC VARCHAR(20),     --现场仓编号
	@BATCH VARCHAR(50),   --批次号
	@NOTE VARCHAR(255),  --备注
	--返回的信息，存储过程会通过出参返回错误信息或操作成功，另有返回值，返回值=0，则说明成功
	@MSG VARCHAR(500) OUTPUT  
AS
BEGIN
    DECLARE @PREFIX VARCHAR(100);
	DECLARE @CURRENT_ORDER VARCHAR(100);
	DECLARE @NEXT_ORDER VARCHAR(100);
	DECLARE @PRODUCT VARCHAR(100);
	DECLARE @QTY_AVALIABLE NUMERIC(12,4);
	DECLARE @WAREHOUSE VARCHAR(100);
	DECLARE @BACK INT; --当BACK=84时，这是一个入库，当BACK=85时，这是一个退库
	DECLARE @NOW VARCHAR(25)
	SELECT  @NOW = CONVERT(VARCHAR(25),GETDATE(),121)
	IF @BATCH IS NULL OR LEN(@BATCH) = 0
	BEGIN
		SET @BATCH  = '********************'
	END
	IF @QTY > 0
	BEGIN
	   SET @BACK = 84
	END
	ELSE
	BEGIN
	   SET @BACK = 85
	END
	SET @QTY = ABS(@QTY)
	SET @PREFIX = 'MD'+@DATE;
	SELECT @CURRENT_ORDER = ISNULL(MAX(RCA002),@PREFIX+'000') FROM SGMRCA WHERE RCA002 LIKE @PREFIX+'%';
	SET @NEXT_ORDER = @PREFIX + RIGHT(1001+CONVERT(INT,RIGHT(@CURRENT_ORDER,5)),3);

	SELECT @PRODUCT=RAA015,@WAREHOUSE = DEA008,@QTY_AVALIABLE = CASE WHEN RAA018-RAA019<0 THEN 0 ELSE  RAA018-RAA019 END
		FROM SGMRAA LEFT JOIN TPADEA ON RAA015=DEA001  
		WHERE (RAA020<>'F') AND RAA018>RAA019  --未完工
		AND RAA024='T'                         --已审核
	    AND RAA001 NOT IN (SELECT RMA001 FROM SGMRMA WHERE RMA016 ='F') --不存在工艺变更
		AND NOT EXISTS(SELECT RAC001 FROM SGMRAC WHERE RAC001=RAA001)   --非工艺管理
		AND RAA001 = @MOCODE;

	IF @PRODUCT IS NULL
	BEGIN
		SET @MSG = '无法根据单号找到符合条件的生产订单，也有可能是生产订单未审核、已完工、正在工艺变更或已进行工艺管理';
		RETURN -1;
	END
	IF @QTY_AVALIABLE < @QTY AND @BACK = 84
	BEGIN
		SET @MSG = '可用数量不足';
		RETURN -2;
	END;
	IF @QTY = 0
	BEGIN
		SET @MSG = '可用数量不能为0';
		RETURN -2;
	END;
	BEGIN TRANSACTION;
	BEGIN TRY
	/* 单头 */
	INSERT INTO SGMRCA(
		RCA001,--84是生产入库，85是退库
		RCA002,--单号
		RCA004,--日期，填入@DATE
		RCA005,--经办人，填入@HANDLER
		RCA006,--部门，填入@DEPT
		RCA012,--入库数量，填入0
		RCA016,--审核码，填入F
		RCA019,--是否检验,填入F
		RCA025,--审核人，填入NULL
		RCA026,--凭证是否抛转，填入F
		RCA029,--报废数量，填入0
		RCA034,--待重工量，填入0
		RCA035,--已重工量，填入0
		RCA036,--已报废量，填入0
		RCA901,--录入者编号，填入@HANDLER
		RCA902,--录入时间，填入GETDATE()
		RCA905,--更新标记，填入1或5（退）
		RCA013 --备注
		--RCA980~985为自定义
	)VALUES(@BACK,@NEXT_ORDER,@DATE,@HANDLER,@DEPT,0,'F','F',NULL,'F',0,0,0,0,@HANDLER,@NOW,CASE @BACK WHEN 84 THEN 1 ELSE 5 END,@NOTE);
	
	

	/* 单身-入库 */
	INSERT INTO SGMRCC(
		RCC001,--固定84
		RCC002,--单号，@NEXT_ORDER
		RCC003,--固定81
		RCC004,--来源单号
		RCC011,--来源序号
		RCC022,--序号，因为单身永远只有一笔，所以序号指定为001即可
		RCC008,--批号，无批号填入********************
		RCC005,--入库仓库
		RCC006,--入库数量,填入@QTY
		RCC007,--报废数量，填入0
		RCC010,--品号
		RCC014,--待重工入库量，填入0
		RCC015,--已报废数量，填入0
		RCC023,--副产品入库，填入F
		RCC901,--录入者编号，填入@HANDLER
		RCC902,--录入时间，填入GETDATE()
		RCC905--更新标记，填入1
		--RCC980~995为自定义
	)VALUES(@BACK,@NEXT_ORDER,'81',@MOCODE,'000','001',@BATCH,@WAREHOUSE,@QTY,0,@PRODUCT,0,0,'F',@HANDLER,@NOW,CASE @BACK WHEN 84 THEN 1 ELSE 2 END);

	
	/* 单身-耗用 */
	INSERT INTO SGMRCB(
		RCB001,--固定84
		RCB002,--单号，@NEXT_ORDER
		RCB021,--固定81
		RCB022,--来源单号
		RCB023,--来源序号,固定000
		RCB003,--序号，引入单身档序号
		RCB029,--单身序号
		RCB028,--单身批号，无批号填入********************
		RCB004,--子件品号
		RCB005,RCB006,--品名单位
		RCB007,--耗用仓库
		RCB008,--耗用量
		RCB010,--审核码，填入T
		RCB018,--报废耗用数量，填入0
		RCB019,--批号，无批号填入********************
		RCB024,--主件品号
		RCB027,--工单序号，填入001，但是好像有点解释不通
		RCB901,--录入者编号，填入@HANDLER
		RCB902,--录入时间，填入GETDATE()
		RCB905--更新标记，填入1
		) SELECT @BACK,@NEXT_ORDER, '81',@MOCODE,'000',RAB002,'001','********************',RAB003,DEA002,DEA003,
			@XCC,@QTY*RAB007/RAA018,--按标准用量来计算耗用量,即预计耗用量/生产数量*本次入库
			'T',0,@BATCH,RAA015,RAB002,@HANDLER,@NOW,CASE @BACK WHEN 84 THEN 1 ELSE 2 END
		FROM SGMRAB 
		LEFT JOIN SGMRAA ON RAB001 = RAA001
		LEFT JOIN TPADEA ON RAB003 = DEA001
		WHERE RAB001 = @MOCODE AND RAB010 = 'N';

	COMMIT;
	SET @MSG = @NEXT_ORDER;
	RETURN 0;
	END TRY
	BEGIN CATCH
	ROLLBACK;
	SET @MSG = ERROR_MESSAGE();
	RETURN -3;
	END CATCH;


END;